跳到主要内容

Apache Bench 压力测试

参考资料 超实用压力测试工具-ab工具 参考资料 web性能测试:apache benchmark(ab)

ApacheBenchmark 是什么?

开发完网站或者 web接口后,一个比较负责任的工作就是测试一下接口性能,也叫做压力测试。web接口性能直接反映了接口的并发处理能力,一个数值评估通常可以给系统性能给出一个比较好的反馈。

Apache Bench(简称为ab)是 Apache 提供用于对 Apache http server 进行基准测试的工具。但是由于其安装和使用简单,所以也可以用于对HTTP接口的压力测试和性能测试。

ab是一个命令行工具,使用ab命令可以模拟多线程并发请求,并且对负载机的要求很低,既不会占用很高CPU,也不会占用很多内存,但却会给目标服务器造成巨大的负载,其原理类似 DDOS/CC 攻击。(ab 命令会创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问)

经常说的 Apache Benchmark(ab测试)其实就是 ab压力测试,用来帮助 web开发者了解所开发网站的性能。

Tips:在带宽不足的情况下,最好是本机进行测试,建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。远程对 web服务器进行压力测试,往往效果不理想(因为网络延时过大或带宽不足)

它的测试目标是基于 URL 的,因此,它既可以用来测试 apache 的负载压力,也可以测试 nginx、lighthttp、tomcat、IIS 等其它 Web 服务器的压力。

ab 命令对发出负载的计算机要求很低,它既不会占用很高 CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似 CC 攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。

常见的几个术语

吞吐率

吞吐率(Requests per second)

概念:服务器并发处理能力的量化描述,单位是 request / s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。

计算公式:总请求数 / 处理完成这些请求数所花费的时间,即

Request per second = Complete requests / Time taken for tests

并发连接数

并发连接数(The number of concurrent connections)

概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。

并发用户数

并发用户数(The number of concurrent users,Concurrency Level)

概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。

用户平均请求等待时间

用户平均请求等待时间(Time per request)

计算公式:处理完成所有请求数所花费的时间 / (总请求数 / 并发用户数),即

Time per request = Time taken for tests /( Complete requests / Concurrency Level)

服务器平均请求等待时间

服务器平均请求等待时间(Time per request: across all concurrent requests)

计算公式:处理完成所有请求数所花费的时间 / 总请求数,即

Time taken for / testsComplete requests

可以看到,它是吞吐率的倒数,同时,它也 = 用户平均请求等待时间 / 并发用户数,即

Time per request / Concurrency Level

配置环境

官方的 下载地址 参考资料 Ubuntu Apache AB压力测试

Ubuntu 下载安装

sudo apt-get update
sudo apt-get install apache2-utils

基本用法

# -n 总的请求数
# -c 一次同时并发的请求数
# 总的请求数(n) = 次数 * 一次并发数(c)

ab -n 100 -c 10 http://alsritter.icu/
# 可以使用下面这个命令输出到 HTML 文件里面去
# ab -n 100 -c 10 -w http://alsritter.icu/ > temp.html

测试 POST 请求

参考资料 Example of using Apache Bench (ab) to POST JSON to an API

application/json 形式发送

假定需要发送的 JSON 数据为

{"name" : "hello,world"}

创建一个 post_loc.txt 文件到本地,把上面的 JSON 数据写入,然后这样发送数据

ab -p post_loc.txt -T application/json -H 'Authorization: Token abcd1234' -c 10 -n 2000 http://example.com/api/v1/locations/

如何分析打印结果

This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking alsritter.icu (be patient).....done


Server Software: nginx/1.10.3
Server Hostname: alsritter.icu
Server Port: 80

Document Path: /
Document Length: 194 bytes

# 以上是你打压力的host, port等一部分的信息

Concurrency Level: 10 # 并发度
Time taken for tests: 1.704 seconds # 整个测试持续的时间
Complete requests: 100 # 完成请求数目
Failed requests: 0 # 失败次数
Non-2xx responses: 100

Total transferred: 39500 bytes # 总共传输数据
HTML transferred: 19400 bytes


Requests per second: 58.68 [#/sec] (mean) # QPS,每秒完成的请求数目,是系统最重要的指标
Time per request: 170.410 [ms] (mean) # 每组请求用时
Time per request: 17.041 [ms] (mean, across all concurrent requests) # 平均每个请求用时 17.041 毫秒
Transfer rate: 22.64 [Kbytes/sec] received # 网络传输速率

Connection Times (ms)
min mean[+/-sd] median max
Connect: 70 85 10.1 82 115
Processing: 73 85 5.5 84 97
Waiting: 73 85 5.5 84 96
Total: 147 170 11.2 168 203
# 以上这段数据标志了一个请求从连接,发送数据,接收数据这个三个大致的时间,最小以及平均值


# 以下是请求完成时间的分布,在这个请求中有 50% 在 168 毫秒中完成
Percentage of the requests served within a certain time (ms)
50% 168
66% 173
75% 177
80% 178
90% 184
95% 191
98% 199
99% 203
100% 203 (longest request)

常用参数

-t timelimit  测试时间限制,单位秒
-s timeout 每个请求时间限制,单位秒
-v verbosity 日志输出级别,可以选择1, 2等,调试使用
-T content-type POST/PUT接口的content-type
-p postfile POST请求发送的数据文件

全部参数一览

通过 ab -h 就可以知道有哪些参数

Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
-n requests 要执行的请求总数
-c concurrency 一次请求的并发数目
-t timelimit 测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对
服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-s timeout 等待每个响应的最大超时时间
Default is 30 seconds
-b windowsize TCP 发送 / 接收缓冲区的大小,以字节为单位
-B address 当建立外向连接时要绑定到的地址
-p postfile POST 时的数据文件,记得要设置 -T
-u putfile File containing data to PUT. Remember also to set -T
-T content-type Content-type header to use for POST/PUT data, eg.
'application/x-www-form-urlencoded'
Default is 'text/plain'
-v verbosity How much troubleshooting info to print
-w 以 HTML 表的格式输出结果
-i Use HEAD instead of GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. 'Apache=1234'. (repeatable)
-H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-q Do not show progress when doing more than 150 requests
-l Accept variable document length (use this for dynamic pages)
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-r Don't exit on socket receive errors.
-m method Method name
-h Display usage information (this message)
-I Disable TLS Server Name Indication (SNI) extension
-Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
-f protocol Specify SSL/TLS protocol

tail 命令

tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅 正在改变的日志文件

tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。

命令格式:

tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ]

使用例子:

# -f 该参数用于监视 File 文件增长。
# -c Number 从 Number 字节位置读取指定文件
# -n Number 从 Number 行位置读取指定文件。
# -m Number 从 Number 多字节字符位置读取指定文件,比方你的文件假设包括中文字,假设指定-c 参数,可能导致截断,但使用 -m 则会避免该问题。
# -b Number 从 Number 表示的 512 字节块位置读取指定文件。
# -k Number 从 Number 表示的 1KB 块位置读取指定文件。
# File 指定操作的目标文件名称

# 上述命令中,都涉及到 number,假设不指定,默认显示 10 行。
# Number 前面可使用正负号,表示该偏移从顶部还是从尾部開始计算。

# 监视 filename 文件的尾部内容(默认10行,相当于增加参数 -n 10),刷新显示在屏幕上。
tail -f filename

# 显示 filename 最后 20 行。
tail -n 20 filename

# 逆序显示 filename 最后 10 行
tail -r -n 10 filename


tail -n 100 filename #显示最后100行数据
tail -n -100 filename #除了前99行不显示外,显示第100行到末尾行